package com.itheima.springbootwebtlias.mapper;

import com.itheima.springbootwebtlias.pojo.CountItem;
import com.itheima.springbootwebtlias.pojo.Emp;
import com.itheima.springbootwebtlias.pojo.EmpQueryParam;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.util.List;
import java.util.Map;

@Mapper
public interface EmpMapper {

//    @Select("select e.*,d.name from emp e " +
//            "left join dept d on e.dept_id = d.id " +
//            "where e.name like '%${name}%' and gender = #{gender} and entry_date between #{begin} and #{end}")
    List <Emp> selectByCondition(EmpQueryParam queryParam);

    /**
     * Service分页插件底层原理


     //mybatis框架实现持久层开发
     class EmpMapperproxy implements EmpMapper{

     LiST <Emp> selectByCondition(EmpQueryParam queryParam){
     //1.从数据库连接池中获取连接对象
     //2.从当前方法上解析出SQL语句
     //3.使用反射设置参数
     //4.获取PreparedStatement对象
     //5.使用反射解析结果数据到List<Emp>集合中
     }
     }

     //二，mybatis创建的持久层实现类对象，存储到ioc容器中
     //三 业务层service中
     1.在业务层配置了分页插件
     2.从容其中获取持久层对象EmpMapperProxy查询数据时被mybatis拦截器拦截，功能增强：动态代理
     3.mybatis拦截器功能增强：
     3.1根据页码计算起始位置
     3.2获取原方法SQL语句，追加limit  起始位置，页码
     3.3单独发起select count(*) sql语句，查询总记录数
     3.4将查询数据封装到PageResult对象中，返回给业务层

     */
    //添加员工
    void insert(Emp emp);

    //查询所有员工
    @Select("select * from emp")
    List<Emp> selectAll();

    //批量删除员工
    void deleteBatchById(List<Integer> ids);

    //根据id查询员工 1
    @Select("select * from emp where id = #{id}")
    Emp selectById(Integer id);

    //查询员工详情，同时查询员工对应的工作经历 2
    Emp selectByIdAndExprs(Integer id);

    //更新员工
    void update(Emp emp);

    //根据指定部门id查询员工数量
    @Select("select count(*) from emp where dept_id = #{id}")
    Integer selectByDeptId(Integer id);


    //查询员工对应的职位数量
    @MapKey("name")
    List<Map> jobCount();

    //查询员工对应的性别数量
    @MapKey("name")
    List<Map> genderCount();


    //根据用户名查询员工
    @Select("select * from emp where username = #{username}")
    Emp selectByUsername(String username);
}
